package cn.itcast.web.controller.system;

import cn.itcast.domain.system.Dept;
import cn.itcast.domain.system.Module;
import cn.itcast.domain.system.Role;
import cn.itcast.service.system.DeptService;
import cn.itcast.service.system.ModuleService;
import cn.itcast.service.system.RoleService;
import cn.itcast.web.controller.BaseController;
import com.github.pagehelper.PageInfo;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Controller;
import org.springframework.ui.Model;
import org.springframework.util.StringUtils;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RequestParam;
import org.springframework.web.bind.annotation.ResponseBody;

import java.util.ArrayList;
import java.util.HashMap;
import java.util.List;
import java.util.Map;

@Controller
@RequestMapping("/system/role")
public class RoleController extends BaseController {
    @Autowired
    private RoleService roleService;

    /**
     * 角色：显示角色列表
     * 功能入口：aside.jsp点击角色管理
     * 请求地址：http://locahost:8080/system/role/list.do
     * 响应地址：http://locahost:8080/WEB-INF/pages/system/role/
     */

    @RequestMapping("/list")
    public String list(@RequestParam(defaultValue = "1") Integer pageNum, @RequestParam(defaultValue = "5") Integer pageSize) {
        String companyId = getLoginCompanyId();
        PageInfo<Role> pageInfo = roleService.findByPage(companyId, pageNum, pageSize);
        request.setAttribute("pageInfo", pageInfo);
        return "system/role/role-list";
    }


    /**
     * 角色：进入角色添加页面
     * 功能入口：点击新建
     * 请求地址：http://locahost:8080//system/role/toAdd.do
     * 响应处理：查询所有部門信息放入请求域以便回显在下拉列表
     * 响应地址：http://locahost:8080/WEB-INF/pages/system/role/role-add.jsp
     */
    @Autowired
    private DeptService deptService;

    @RequestMapping("/toAdd")
    public String toAdd() {
        List<Dept> deptList = deptService.findAll(getLoginCompanyId());
        request.setAttribute("deptList", deptList);
        return "system/role/role-add";
    }


    /**
     * 角色：添加/修改角色信息
     * 功能入口：role-add.jsp点击保存
     * 请求地址：http://locahost:8080/system/role/edit.do
     * 响应地址：保存角色数据重定向到/system/role/list角色列表页面重新查询数据显示
     */
    @RequestMapping("/edit")
    public String edit(Role role) {
        //设置企业信息
        role.setCompanyId(getLoginCompanyId());
        role.setCompanyName(getLoginCompanyName());

        if (StringUtils.isEmpty(role.getId())) {
            //参数没有角色id，执行添加
            roleService.save(role);
        } else {
            //有角色id,执行更新
            roleService.update(role);
        }
        return "redirect:/system/role/list";
    }

    /**
     * 角色：进入角色修改页面
     * 功能入口：点击编辑
     * 请求地址：http://locahost:8080/system/role/toUpdate.do?id=n
     * 响应处理：获取请求参数角色id查询角色信息放入请求域在修改页面回显
     * 响应地址：http://locahost:8080WEB-INF/pages/system/role/role-update.jsp
     */
    @RequestMapping("/toUpdate")
    public String toUpdate(Model model, String id) {
        //通过参数id查询一条角色数据
        Role role = roleService.findById(id);
        //查询所有部門回顯部門下拉列表
        List<Dept> deptList = deptService.findAll(getLoginCompanyId());

        model.addAttribute("deptList", deptList).addAttribute("role", role);
        return "system/role/role-update";
    }

    /**
     * 角色：删除一条角色信息
     * 功能入口：role-list.jsp点击删除
     * 请求地址：http://locahost:8080/system/role/delete.do?id=n
     * 响应地址：删除成功返回json{"message",1}
     */

    @RequestMapping("/delete")
    @ResponseBody
    public Map<String, Integer> delete(String id) {
        Map<String, Integer> resultMap = new HashMap<>();
        boolean flag = roleService.delete(id);
        if (flag) {
            resultMap.put("message", 1);
        } else {
            resultMap.put("message", 0);
        }
        return resultMap;
    }


    /**
     * 角色分配权限（一）(进入权限页面)
     * 功能入口：role-list.jsp点击权限
     * 请求地址：http://locahost:8080/system/role/roleModule.do
     * 响应处理：根据参数id查询角色的信息放到请求域
     * 响应地址：http://locahost:8080/WEB-INF/pages/system/role/role-module.jsp
     */

    @RequestMapping("/roleModule")
    public String roleModule(String roleId) {
        //查询角色信息
        Role role = roleService.findById(roleId);
        request.setAttribute("role", role);
        return "system/role/role-module";
    }

    /**
     * 角色分配权限（二）
     * 功能入口：role-module.jsp发送异步请求
     * 请求地址：http://locahost:8080/system/role/getZtreeNodes?rouId=n
     * 返回数据：
     * result = [
     *              { id:2, pId:0, name:"随意勾选 2", checked:true, open:true}
     *          ]
     */
    @Autowired
    private ModuleService moduleService;

    @RequestMapping("/getZtreeNodes")
    @ResponseBody
    public ArrayList<Map<String, Object>> getZtreeNodes(String roleId){
        //定义方法返回的对象
        ArrayList<Map<String, Object>> result = new ArrayList<>();

        //查询所有权限（一个模块就是一个权限）
        List<Module> moduleList = moduleService.findAll();

        //查询点击进入权限页面的角色本来拥有的权限(通过角色查询权限)
        List<Module> roleModuleList  = moduleService.findModuleByRoleId(roleId);

        //封装返回结果
        for (Module module : moduleList) {
            //定义map，封装json数据
            Map<String, Object> map = new HashMap<>();
            map.put("id",module.getId());
            map.put("pId",module.getParentId());
            map.put("name",module.getName());
            map.put("open",true);

            //设置选中 (如果当前角色拥有的权限包含遍历的权限，则选中)
            /*if(roleModuleList.contains(module)){
                map.put("checked",true);
            }*/
            if(roleModuleList.contains(module)){
                map.put("checked",true);
            }

            //map添加到list集合
            result.add(map);
        }
        return result;
    }


    /**
     * 角色分配权限（3）role-module.jsp点击保存，最终实现角色分配权限
     * @param roleId    角色id
     * @param moduleIds 权限id，多个权限id用逗号隔开
     * 访问地址：http://locahost:8080/system/role/updateRoleModule
     * @return 重定向到角色列表页面/system/role/list
     */

    @RequestMapping("/updateRoleModule")
    public String updateRoleModule(String roleId,String moduleIds){
        moduleService.updateRoleModule(roleId,moduleIds);
        return "redirect:/system/role/list";
    }



}
